package org.tri.swing;

import java.awt.GridBagLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.SwingUtilities;

/**
 * La clase {@code EditableComboBoxLabel} utiliza como componente editable
 * un {@code JComboBox}, que permite cambiar los valores del label por alguno
 * de los valores fijos del como box
 * @author kiira
 * @version 1.0, Feb 11, 2012
 */
public class EditableLabelCB extends AbstractEditableLabel<JComboBox> {
   
    /**
     * {@inheritDoc}
     */
    @Override
    public String preCheck( String text ) {
        //si el componente editable esta asignado, debemos comprobar el valor
        if ( editableComponent != null ) {
            //si el texto es una cadena vacia, reseteamos el combo
            if ( text.equals( "" ) ) 
                editableComponent.setSelectedItem( null );                               
            
            //si no, seleccionamos el item correspondiente, corroborando que
            //el mismo exista efectivamente
            else {
                editableComponent.setSelectedItem( text );

                Object selected = editableComponent.getSelectedItem();

                text = ( selected != null ) ? selected.toString() : "";

            }

        }//end if

        return text;

    }//end método setText
   
    /**
     * Devuelve el indice del combo box siendo actualmente seleccionado.
     * @return indice del item seleccionado.
     */
    public int getSelectedIndex() {
        return editableComponent.getSelectedIndex();
        
    }//end método getSelectedIndex
            
    /**
     * {@inheritDoc}
     */
    @Override
    public void makeEditable( ) {
        makeEditable( new DefaultComboBoxModel() );

    }//end método makeEditable

    /**
     * Este método debe ser llamado para permitir que el label sea modificado.
     * Este método permite asignar un modelo para el {@code JComboBox} 
     * utilizado como componente de edición.
     * @param model modelo a utilizar en el combo box.
     */
    public void makeEditable( ComboBoxModel model ) {
        //asignamos el combomodel
        editableComponent = new JComboBox( model );
        
        //llamamos al método padre
        super.makeEditable( );
        
        //asignamos el tamaño del combo box como tamaño preferido
        setPreferredSize( editableComponent.getPreferredSize() );

        //cambiamos el componente
        ( (GridBagLayout)container.getLayout() ).setConstraints( this,
                                                                 constraints );
        
        //asignamos el texto actual como item selccionado
        setText( getText() );

    }//end método makeEditable
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void deactivateEditMode() {
        //solo realizamos la acción si esta siendo modificado
        if ( !isBeingEdited() )
            return;

        //removemos el componente editable del contenedor
        container.remove( editableComponent );

        //obtenemos el item seleccionado y lo asignamos
        Object selected = editableComponent.getSelectedItem();
        String newText = ( selected != null ) ? selected.toString() : "";
        applyEdition( newText );

        //reincorporamos el label al contenedor
        container.add( this, constraints );

        container.revalidate();
        container.repaint();

    }//end método deavtivateEditMode

    /**
     * {@inheritDoc}
     */
    @Override
    public void activateEditMode() {
        //solo realizamos la accion si NO esta siendo editado
        if ( isBeingEdited() )
            return;

        //removemos el label
        container.remove( this );

        //reseteamos la constraint fill
        constraints.fill = defaultFillValue;

        //agregamos el componente editable al contenedor
        container.add( editableComponent, constraints );
        editableComponent.requestFocus();

        container.revalidate();
        container.repaint();
        
        //extendemos el popup
        SwingUtilities.invokeLater( new Runnable() {

            @Override
            public void run() {
                editableComponent.showPopup();
                
            }
            
        });

    }//end método activateEditMode

}//end clase EditableLabelCB